<script>
// 使用：引用/注册全局
// <tiny-render :template="customRender" :params="{p: '123'}"></tiny-render>
export default {
	name: "TinyRender",
	props: {
		/**
		 * @description 传入一个函数，函数接收一个参数h，返回一个vnode
		 * @type {Function}
		 * @required true
		 */
		template: {
			type: Function,
			required: true
		},
		/**
		 * @description 传入的参数
		 * @type {Object|Array}
		 */
		params: {
			type: Object | Array,
			default: () => ({})
		}
	},
	methods: {
		/**
		 * @description 判断是否是vnode
		 * @param node
		 * @returns {Boolean}
		 */
		isVNode(node) {
			return node && node.hasOwnProperty('componentOptions')
		}
	},
	render(h) {
		try {
			if (Object.prototype.toString.call(this.template) !== '[object Function]') {
				throw new Error('TinyRender组件的template属性必须是一个函数')
			}

			let node;

			if (Array.isArray(this.params)) {
				node = this.template(h, ...this.params)
			} else {
				node = this.template(h, this.params)
			}

			if (!node || !node.hasOwnProperty('componentOptions')) {
				throw new Error('TinyRender组件的template属性必须返回一个vnode')
			}

			return node
		} catch (e) {
			console.error('TinyRender组件渲染出错', e)
			return null
		}
	}
}
</script>